From b4096cee640002e5a63a3d6bb26cb07b7dd7621d Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 12 Jul 2020 18:24:04 -0400 Subject: [PATCH] gtk-demo: Work harder to filter the tree Arrange for an item to be visible if it either matches the filter or has children that do. --- demos/gtk-demo/main.c | 53 ++++++++++++++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 13 deletions(-) diff --git a/demos/gtk-demo/main.c b/demos/gtk-demo/main.c index 5bad5e80aa..880dcbaf1b 100644 --- a/demos/gtk-demo/main.c +++ b/demos/gtk-demo/main.c @@ -965,12 +965,33 @@ selection_cb (GtkSingleSelection *sel, gtk_window_set_title (GTK_WINDOW (toplevel), demo->title); } +static gboolean +filter_demo (GtkDemo *demo) +{ + int i; + + /* Show only if the name maches every needle */ + for (i = 0; search_needle[i]; i++) + { + if (!demo->title) + return FALSE; + + if (g_str_match_string (search_needle[i], demo->title, TRUE)) + continue; + + return FALSE; + } + + return TRUE; +} + static gboolean demo_filter_by_name (GtkTreeListRow *row, GtkFilterListModel *model) { + GListModel *children; GtkDemo *demo; - guint i; + guint i, n; /* Show all items if search is empty */ if (!search_needle || !search_needle[0] || !*search_needle[0]) @@ -979,22 +1000,28 @@ demo_filter_by_name (GtkTreeListRow *row, g_assert (GTK_IS_TREE_LIST_ROW (row)); g_assert (GTK_IS_FILTER_LIST_MODEL (model)); - demo = gtk_tree_list_row_get_item (row); - g_assert (GTK_IS_DEMO (demo)); - - /* Show only if the name maches every needle */ - for (i = 0; search_needle[i]; i++) + children = gtk_tree_list_row_get_children (row); + if (children) { - if (!demo->title) - return FALSE; - - if (g_str_match_string (search_needle[i], demo->title, TRUE)) - continue; + n = g_list_model_get_n_items (children); + for (i = 0; i < n; i++) + { + demo = g_list_model_get_item (children, i); + g_assert (GTK_IS_DEMO (demo)); - return FALSE; + if (filter_demo (demo)) + { + g_object_unref (demo); + return TRUE; + } + g_object_unref (demo); + } } - return TRUE; + demo = gtk_tree_list_row_get_item (row); + g_assert (GTK_IS_DEMO (demo)); + + return filter_demo (demo); } static void -- 2.30.2